/** * Copyright (c) 2008, Aberystwyth University * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * - Neither the name of the Centre for Advanced Software and * Intelligent Systems (CASIS) nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ package org.purl.sword.client; import java.awt.BorderLayout; import java.util.Enumeration; import java.util.Properties; import javax.swing.DefaultCellEditor; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; /** * Dialog that is used to edit the collection of properties. * * @author Neil Taylor, Suzana Barreto */ public class PropertiesDialog { /** * The parent frame for the dialog that is displayed. */ private JFrame parentFrame = null; /** * Array that lists the labels for the buttons on the panel. */ private static Object[] options = {"OK", "Cancel" }; /** * The panel that holds the controls to show. */ private JPanel controls = null; /** * The configuration properties */ private Properties properties = null; /** * Table that is used to display the list of properties. */ private JTable propertiesTable; /** * Create a new instance. * * @param parentFrame The parent frame for the dialog. * @param props The properties lisst to display */ public PropertiesDialog(JFrame parentFrame, Properties props) { this.parentFrame = parentFrame; properties = props; controls = createControls(); } /** * Create the controls that are to be displayed in the system. * * @return A panel that contains the controls. */ protected JPanel createControls( ) { JPanel panel = new JPanel(new BorderLayout()); propertiesTable = new JTable(new PropertiesModel()); ((DefaultCellEditor)propertiesTable.getDefaultEditor(String.class)).setClickCountToStart(1); JScrollPane scrollpane = new JScrollPane(propertiesTable,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); panel.add(scrollpane, BorderLayout.CENTER); return panel; } /** * Show the dialog and return the status code. * * @return The status code returned from the dialog. */ public int show( ) { int result = JOptionPane.showOptionDialog(parentFrame, controls, "Edit Properties", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, null); // cancel any edit in the table. If there is a cell editing, the getEditingColumn will // return a non-negative column number. This can be used to retreive the cell editor. // The code then gets the default editor and calls the stopCellEditing. If custom // editors are used, an additional check must be made to get the cell editor // for a specific cell. int column = propertiesTable.getEditingColumn(); if( column > -1 ) { TableCellEditor editor = propertiesTable.getDefaultEditor( propertiesTable.getColumnClass(column)); if( editor != null ) { editor.stopCellEditing(); } } return result; } /** * A table model that is used to show the properties. The model links directly * to the underlying properties object. As changes are made in the table, the * corresponding changes are made in the properties object. The user can only * edit the value column in the table. */ public class PropertiesModel extends AbstractTableModel { /** * Column names. */ private String columns[] = {"Property Name","Value"}; /** * Create a new instance of the model. If no properties object exists, * a default model is created. Note, this will allow the table to * continue editing, although this value will not be passed back to * the calling window. */ public PropertiesModel() { super(); if(properties == null) { properties = new Properties(); } } /** * Get the number of columns. * * @return The number of columns. */ public int getColumnCount() { return columns.length; } /** * Get the number of rows. * * @return The number of rows. */ public int getRowCount() { return properties.size(); } /** * Get the value that is at the specified cell. * * @param row The row for the cell. * @param col The column for the cell. * * @return The data value from the properties. */ public Object getValueAt(int row, int col) { if(col == 0) { return getKeyValue(row); } else { String key = getKeyValue(row); return properties.get(key); } } /** * Retrieve the column name for the specified column. * * @param col The column number. * * @return The column name. */ public String getColumnName(int col){ return columns[col]; } /** * Retrieve the column class. * * @param col The column number. * * @return The class for the object found at the column position. */ public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); } /** * Determine if the cell can be edited. This model will only * allow the second column to be edited. * * @param row The cell row. * @param col The cell column. * * @param True if the cell can be edited. Otherwise, false. */ public boolean isCellEditable(int row, int col) { if(col == 1) { return true; } return false; } /** * Set the value for the specified cell. * * @param value The value to set. * @param row The row for the cell. * @param col The column. */ public void setValueAt(Object value, int row, int col) { String key = getKeyValue(row); properties.setProperty(key, ((String) value)); fireTableCellUpdated(row, col); } /** * Get the Key value for the specified row. * @param row The row. * @return A string that shows the key value. */ public String getKeyValue(int row) { int count = 0; Enumeration<Object> k = properties.keys(); while (k.hasMoreElements()) { String key = (String) k.nextElement(); if(count == row){ return key; } count++; } return null; } } }